package com.example.blog_system_ssm.component;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

// 密码工具类
// todo: 加盐加密 / 加盐解密
public class PasswordTools {

    // 加盐加密功能.得到加盐加密后的密码
    public static String encrypt(String password){
        // 1,产生盐值
        String salt = UUID.randomUUID().toString().replace("-","");
        // 2,使用(盐值+明文密码)得到加密的密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));
        // 3,将盐值和加密的密码共同返回得到(合并盐值和加密密码)最终密码
        String dbPassword = salt + "$" + finalPassword;
        return dbPassword;
    }

    // 加盐加密功能.得到加盐加密后的密码
    public static String encrypt(String password,String salt){
        // 1,使用(盐值+明文密码)得到加密的密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));
        // 2,将盐值和加密的密码共同返回得到(合并盐值和加密密码)最终密码
        String dbPassword = salt + "$" + finalPassword;
        return dbPassword;
    }


    // 验证加盐加密后的密码功能
    public static boolean decrypt(String password,String dbPassword){
        Boolean result = false;
        if(StringUtils.hasLength(password) && StringUtils.hasLength(dbPassword)
                && dbPassword.length() == 65 && dbPassword.contains("$")){
            // 1,得到盐值
            String[] passwordArr = dbPassword.split("\\$");
            String salt = passwordArr[0]; // 盐值
            String finalPassword = passwordArr[1]; // 正确密码的加盐加密密码
            // 2,生成验证密码的加盐加密密码
            String checkPassword = encrypt(password,salt);
               if (dbPassword.equals(checkPassword)){
                result = true;
            }
        }
        return result;
    }
}
